// 对象的隐式转换
var obj = { name: 'zhangsan' }
console.log(obj.valueOf());
console.log(typeof obj.valueOf());

// 数组的隐式转换
var arr1 = []
console.log(arr1.valueOf().toString());
console.log(typeof arr1.valueOf().toString());

// 引用数据类型的隐式转换
console.log([] + []);  //结果为 "" + "" = ""
// 1.确定 [] PreferredType 为 number
// 2.确定 [] 不是原始值
// 3.调用 valueOf 方法
console.log([].valueOf(),typeof [].valueOf());
// 4.调用 toString 方法
console.log([].valueOf().toString(),typeof [].valueOf().toString());
// 5.最终 [] 隐式转换 => '' 空的字符串
 


console.log([] + {});   //结果为 "" + "[object Object]" = "[object Object]"
// 1.确定 {} PreferredType 为 number
// 2.确定 {} 不是原始值
// 3.调用 valueOf 方法
console.log({}.valueOf(),typeof {}.valueOf());
// 4.调用 toString 方法
console.log({}.valueOf().toString(),typeof {}.valueOf().toString());
// 5.最终 {} 隐式转换 => "[object Object]"



console.log({} + []); //隐式转换结果为0
// {} + []  => {}; +[]
// js会将{};看成代码块略过，所以就只剩  +[]
// +[]  =>  +""  => +false  => +0  => 0
 


// 但是{} + []在终端的打印结果是[object Object] 是string类型
// 在浏览器控制台又输出 0 
console.log({} + [],typeof ({} + []));



// {} + {} 隐式转换结果为"[object Object][object Object]"
console.log({} + {});

// 赋值运算符
var num = 10
num += 20
console.log(num);